﻿Imports System.IO
Public Class GestionarPersonas
    'Ruta en la que se encuentran los archivos en nuestra aplicación
    Private ruta As String = My.Application.Info.DirectoryPath
    'Lista de personas para gestionar, siempre existira el administrador por defecto
    Private _Personas As New List(Of Persona) From {New Administrador()}

    'Eventos
    Public Event ContraseñaErroneaDebil(ByVal sender As Object, ByVal e As EventArgs)
    Public Event ContraseñaErroneaNula(ByVal sender As Object, ByVal e As EventArgs)
    Public Event PersonaIncorrecta(ByVal sender As Object, ByVal e As EventArgs)
    ''' <summary>
    ''' Personas que tenemos en nuestro sistema
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public ReadOnly Property Personas As ObjectModel.ReadOnlyCollection(Of Persona)
        Get
            Return _Personas.AsReadOnly
        End Get
    End Property
    ''' <summary>
    ''' Constructor que extrae los Personas del archivo Personas.txt
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New()
        '_Personas.Add(New Administrador())
        If Not File.Exists(ruta & "\Personas.txt") Then Exit Sub ' Si no existe el archivo comienza con la lista vacía
        Dim fichero As StreamReader = Nothing
        Try
            fichero = New StreamReader(ruta & "\Personas.txt")

            Do Until fichero.EndOfStream
                Dim linea As String = fichero.ReadLine
                Dim datos() As String = linea.Split("*")
                If datos.Length = 2 Then _Personas.Add(New Administrador(datos(0), datos(1)))
                If datos.Length = 5 Then _Personas.Add(New Cliente(datos(0), datos(1), datos(2), datos(3), datos(4)))

            Loop
        Catch ex As Exception
            _Personas.Clear()
        Finally
            fichero.Close()
        End Try
    End Sub
    ''' <summary>
    ''' Añade las Personas a la Lista
    ''' </summary>
    ''' <param name="per">Nombre de la persona</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function AñadirLista(ByVal per As Persona) As String
        If per Is Nothing Then Return "No se puede registrar"
        If per.Contraseña Is Nothing Then
            RaiseEvent ContraseñaErroneaNula(per, New EventArgs)
            Return ""
        End If

        If per.Nombre Is Nothing Then
            RaiseEvent PersonaIncorrecta(per, New EventArgs)
            Return ""
        End If

        If TryCast(per, Cliente).Email Is Nothing Then
            RaiseEvent PersonaIncorrecta(per, New EventArgs)
            Return ""
        End If

        If TryCast(per, Cliente).TarjetaCredito Is Nothing Then
            RaiseEvent PersonaIncorrecta(per, New EventArgs)
            Return ""
        End If

        If TryCast(per, Cliente).FechaCaducidad Is Nothing Then
            RaiseEvent PersonaIncorrecta(per, New EventArgs)
            Return ""
        End If

        If _Personas.Contains(per) AndAlso _Personas.Count > 1 Then Return per.Nombre & " ya existe."
        If TryCast(per, Cliente).TarjetaCredito.Length <> 16 Then Return "La tarjeta de " & per.Nombre & " no cumple los requisitos"

        'restricciones de fecha
        Dim año, mes As Integer
        mes = Integer.Parse(TryCast(per, Cliente).FechaCaducidad.Split("/")(0))
        año = Integer.Parse("20" & TryCast(per, Cliente).FechaCaducidad.Split("/")(1))
        If año < Today().Year Or (año = Today().Year AndAlso mes < Today().Month) Then
            Return "La tarjeta esta caducada"
        End If
        'eventos contraseña buscar
        'If per.Contraseña <> per.Contraseña.ToLower Then RaiseEvent ContraseñaErroneaDebil(per, New EventArgs)

        _Personas.Add(per)

        Return ""
    End Function
    ''' <summary>
    ''' Grabamos la lista en el archivo Personas.txt
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function Grabar() As String
        Dim fichero As StreamWriter = Nothing
        Try
            fichero = New StreamWriter(ruta & "\Personas.txt")
            For Each per In _Personas
                If per.GetType = GetType(Administrador) Then fichero.WriteLine(per.Nombre & "*" & per.Contraseña)
                If per.GetType = GetType(Cliente) Then fichero.WriteLine(per.Nombre & "*" & per.Contraseña & "*" & TryCast(per, Cliente).Email & "*" & TryCast(per, Cliente).TarjetaCredito & "*" & TryCast(per, Cliente).FechaCaducidad)
            Next
        Catch ex As Exception
            fichero.Close()
            Return ex.Message
        Finally
            fichero.Close()
        End Try
        Return ""
    End Function
    ''' <summary>
    ''' Nos dan la Persona que debemos agregar a la Lista
    ''' </summary>
    ''' <param name="per">Nombre de la persona</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Añadir(ByVal per As Persona) As String
        Dim men As String = AñadirLista(per)
        If men = "" Then Grabar()
        Return men
    End Function
    ''' <summary>
    ''' Borrar Lista Clientes
    ''' </summary>
    ''' <param name="nombre">Nommbre de la persona</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function BorrarCliente(ByVal nombre As String) As String
        Dim per As New Cliente(nombre, "aaaaaaaaa", "aaaaa@aaaa", "1234567891231256", "")
        If Not _Personas.Contains(per) Then Return "No existe el cliente: " & per.Nombre
        per = _Personas(_Personas.IndexOf(per))
        _Personas.Remove(per)
        Return ""
    End Function
    ''' <summary>
    ''' Borrar una Persona
    ''' </summary>
    ''' <param name="nombre">Nombre de la persona</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function BorrarC(ByVal nombre As String) As String
        Dim men As String = BorrarCliente(nombre)
        If men = "" Then Grabar()
        Return men
    End Function
    ''' <summary>
    ''' Modificar lista Clientes
    ''' </summary>
    ''' <param name="clienteNuevo">Nombre cliente nuevo</param>
    ''' <param name="nombreClienteViejo">Nombre cliente antiguo</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function ModificarCliente(ByVal clienteNuevo As Cliente, ByVal nombreClienteViejo As String) As String
        Dim clienteViejo As New Cliente(nombreClienteViejo, "aaaaaaaaa", "aaaaa@aaaa", "1234567891231256", "")
        If clienteNuevo Is Nothing OrElse clienteViejo Is Nothing Then Return "No se puede modificar"
        'restricciones de fecha
        Dim año, mes As Integer
        mes = Integer.Parse(TryCast(clienteNuevo, Cliente).FechaCaducidad.Split("/")(0))
        año = Integer.Parse("20" & TryCast(clienteNuevo, Cliente).FechaCaducidad.Split("/")(1))
        If año < Today().Year Or (año = Today().Year AndAlso mes < Today().Month) Then
            Return "La tarjeta esta caducada"
        End If
        If Not _Personas.Contains(clienteViejo) Then Return "No existe el cliente: " & clienteViejo.Nombre
        'Dim indice As Integer = _Personas.IndexOf(clienteViejo)
        Dim logitudListaAntesBorrar As Integer = _Personas.Count
        BorrarC(nombreClienteViejo)
       
        _Personas.Add(clienteNuevo)


        Return ""
    End Function
    ''' <summary>
    ''' Modificar un Cliente
    ''' </summary>
    ''' <param name="clienteModificado">Nombre cliente ya modificado</param>
    ''' <param name="nombreClienteViejo">Nombre del cliente que se ha modificado</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Modificar(ByVal clienteModificado As Cliente, ByVal nombreClienteViejo As String) As String
        Dim men As String = ModificarCliente(clienteModificado, nombreClienteViejo)
        If men = "" Then Grabar()
        Return men
    End Function
End Class
